package Array;

import java.util.Arrays;

/**
 * 274. H 指数
 *
 * 给你一个整数数组 citations ，其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。
 *
 * 根据维基百科上 h 指数的定义：h 代表“高引用次数” ，一名科研人员的 h 指数 是指他（她）至少发表了 h 篇论文，
 * 并且 至少 有 h 篇论文被引用次数大于等于 h 。如果 h 有多种可能的值，h 指数 是其中最大的那个。

    解题思路：首先，我们得明白h指数的定义，
           H指数的计算方法如下：
          首先，列出该学者或科学家的所有论文，并按照每篇论文的被引用次数从高到低进行排序。
          然后，对每篇论文的引用次数进行计数，直到引用次数小于当前论文的排名位置。
          计数停止时的论文排名位置，即为该学者或科学家的H指数。
 例如，如果一个学者有5篇论文，按照引用次数从高到低排序后，分别为10次、8次、5次、3次和1次引用。那么，该学者的H指数为3，因为他有3篇论文的引用次数至少为3次。
    通过h指数的定义， h指数的计算方法可以总结为： 如果当前元素i的引用次数大于等于位置i时的排名位置，则h指数更新，否则停止计数。
    所以，我们可以先对数组进行排序，然后根据下标判断引用次数是否大于或者等于当前排名位置，
    解题步骤：
         1：对数组citations进行排序，定义返回值h，默认值为0
         2：遍历数组，从后向前遍历，当前论文的排名位置为 数组长度-当前下标i，最后一位排名是首位，  排名位置 = n - i
         3：如果当前论文的引用次数大于等于当前论文的排名位置，则h指数更新，h++ ,否则停止计数。
         4：返回h指数。
    翻译代码：
 */
public class HIndexQuestion {

    public int hIndex(int[] citations) {
        Arrays.sort(citations);
        int h = 0;
        int n = citations.length;
        for (int i = citations.length - 1; i >= 0; i--) {
            // 排名位置
            int rank = n - i;
            if(citations[i] >= rank){
                h++;
            }else{
                break;
            }
        }
        return h;
    }


    public static void main(String[] args) {
        HIndexQuestion solution = new HIndexQuestion();
        int[] citations = new int[]{1,0,0};
        int hIndex = solution.hIndex(citations);
        System.out.println("The researcher's h-index is: " + hIndex);
    }
}
